
package com.hexinfo.dmpro.script.config.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hexinfo.dmpro.common.base.PageResult;
import com.hexinfo.dmpro.common.model.ClusterSparingConf;
import com.hexinfo.dmpro.common.service.ClusterSparingConfService;
import com.hexinfo.dmpro.common.utils.CommonConstants;
import com.hexinfo.dmpro.script.config.model.ConfigPropertyJdbcconfig;
import com.hexinfo.dmpro.script.config.dao.ConfigPropertyJdbcconfigMapper;
import com.hexinfo.dmpro.script.config.model.ConfigPropertyPublishuser;
import com.hexinfo.dmpro.script.config.service.ConfigPropertyJdbcconfigService;
import com.hexinfo.dmpro.script.pack.entity.ScriptPackTaskEntity;
import org.springframework.stereotype.Service;

import java.sql.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @Package com.hexinfo.dmpro.script.config.service.impl
 * @ClassName ConfigPropertyJdbcconfigServiceImpl
 * @Description jdbc配置表
 * @Author le.zhang
 * @Date 2024/3/4 13:08
 * @Version v1.0
 **/
@Service
public class ConfigPropertyJdbcconfigServiceImpl extends ServiceImpl<ConfigPropertyJdbcconfigMapper, ConfigPropertyJdbcconfig> implements ConfigPropertyJdbcconfigService {

    private final ClusterSparingConfService clusterSparingConfService;

    public ConfigPropertyJdbcconfigServiceImpl(ClusterSparingConfService clusterSparingConfService) {
        this.clusterSparingConfService = clusterSparingConfService;
    }
/**
 * @Method queryList
 * @Param page
 * @Param configPropertyJdbcconfig
 * @Return com.hexinfo.dmpro.common.base.PageResult
 * @Description 分页查询
 * @Author le.zhang
 * @Date 2024/3/4 13:09
 * @Version V1.0
 */
    @Override
    public PageResult queryList(Page page, ConfigPropertyJdbcconfig configPropertyJdbcconfig) {
        LambdaQueryWrapper<ConfigPropertyJdbcconfig> wrapper = beforeQuery(configPropertyJdbcconfig);
        Page returnPage = this.baseMapper.selectPage(page, wrapper);
        List<ConfigPropertyJdbcconfig> configPropertyJdbcconfigList = returnPage.getRecords();
        afterQuery(returnPage.getRecords());
        return new PageResult(configPropertyJdbcconfigList,returnPage.getTotal());
    }

/**
 * @Method beforeQuery
 * @Param configPropertyJdbcconfig
 * @Return com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<com.hexinfo.dmpro.script.config.model.ConfigPropertyJdbcconfig>
 * @Description 分页前置查询，通过集群名称精确查，名称模糊查，数据库类型精确查
 * @Author le.zhang
 * @Date 2024/3/4 13:09
 * @Version V1.0
 */
    private LambdaQueryWrapper<ConfigPropertyJdbcconfig> beforeQuery(ConfigPropertyJdbcconfig configPropertyJdbcconfig){
        LambdaQueryWrapper<ConfigPropertyJdbcconfig> wrapper = Wrappers.lambdaQuery();
        if (StrUtil.isNotBlank(configPropertyJdbcconfig.getClusterId())) {
            wrapper.eq(ConfigPropertyJdbcconfig::getClusterId, configPropertyJdbcconfig.getClusterId());
        }
        if (StrUtil.isNotBlank(configPropertyJdbcconfig.getMark())) {
            wrapper.like(ConfigPropertyJdbcconfig::getMark, configPropertyJdbcconfig.getMark());
        }
        if (StrUtil.isNotBlank(configPropertyJdbcconfig.getDatabaseType())) {
            wrapper.eq(ConfigPropertyJdbcconfig::getDatabaseType, configPropertyJdbcconfig.getDatabaseType());
        }
        return wrapper;
    }

/**
 * @Method afterQuery
 * @Param configPropertyPublishuserList
 * @Return void
 * @Description 分页后置处理，将集群id转换为集群名称存入对象中
 * @Author le.zhang
 * @Date 2024/3/4 13:09
 * @Version V1.0
 */
    private void afterQuery(List<ConfigPropertyJdbcconfig> configPropertyPublishuserList) {
        for (ConfigPropertyJdbcconfig configPropertyJdbcconfig : configPropertyPublishuserList) {
            ClusterSparingConf byId = clusterSparingConfService.getById(configPropertyJdbcconfig.getClusterId());
            if (byId != null) {
                configPropertyJdbcconfig.setClusterName(byId.getClusterName());
            }
        }
    }


/**
 * @Method findAll
 * @Param
 * @Return java.util.List<com.hexinfo.dmpro.script.config.model.ConfigPropertyJdbcconfig>
 * @Description json配置文件到数据库后获取所有数据
 * @Author le.zhang
 * @Date 2024/3/4 13:09
 * @Version V1.0
 */
    public List<ConfigPropertyJdbcconfig> findAll(){
        LambdaQueryWrapper<ConfigPropertyJdbcconfig> wrapper = Wrappers.lambdaQuery();
        List<ConfigPropertyJdbcconfig> configPropertyJdbcconfigList = this.baseMapper.selectList(wrapper);
        return configPropertyJdbcconfigList;
    }

    /**
     * @Method queryOneByInfo
     * @Param
     * @param configPropertyJdbcconfig
     * @Return com.hexinfo.dmpro.script.config.model.ConfigPropertyJdbcconfig
     * @Description 根据传入信息获取指定的一条数据
     * @Author Wang zhihao
     * @Date 2024/3/26 16:54
     * @Version V1.0
     */
    @Override
    public ConfigPropertyJdbcconfig queryOneByInfo(ConfigPropertyJdbcconfig configPropertyJdbcconfig) {
        try {
            LambdaQueryWrapper<ConfigPropertyJdbcconfig> wrapper = Wrappers.lambdaQuery();
            if (StrUtil.isNotBlank(configPropertyJdbcconfig.getClusterId())) {
                wrapper.eq(ConfigPropertyJdbcconfig::getClusterId, configPropertyJdbcconfig.getClusterId());
            }
            if (StrUtil.isNotBlank(configPropertyJdbcconfig.getMark())) {
                wrapper.eq(ConfigPropertyJdbcconfig::getMark, configPropertyJdbcconfig.getMark());
            }
            if (StrUtil.isNotBlank(configPropertyJdbcconfig.getDatabaseType())) {
                wrapper.eq(ConfigPropertyJdbcconfig::getDatabaseType, configPropertyJdbcconfig.getDatabaseType());
            }
            if (StrUtil.isNotBlank(configPropertyJdbcconfig.getJdbcName())) {
                wrapper.eq(ConfigPropertyJdbcconfig::getJdbcName, configPropertyJdbcconfig.getJdbcName());
            }
            return this.baseMapper.selectOne(wrapper);
        } catch (Exception e) {
            log.error("根据条件获取指定数据库连接信息异常：" + e.getMessage(), e);
            throw new RuntimeException("根据条件获取指定数据库连接信息异常" + e.getMessage(), e);
        }
    }

    @Override
    public Map<String, String> connectTest(ConfigPropertyJdbcconfig configPropertyJdbcconfig) {
        Map<String, String> result = new HashMap<>();
        String statueFlag = "";
        Connection conn = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            Class.forName(configPropertyJdbcconfig.getDriverclassname());
            conn = DriverManager.getConnection(configPropertyJdbcconfig.getUrl(),configPropertyJdbcconfig.getUsername(),configPropertyJdbcconfig.getPassword());
            if (conn != null && !conn.isClosed()){
                String querySql = "oracle".equalsIgnoreCase(configPropertyJdbcconfig.getDatabaseType()) ? "SELECT 1 FROM dual" : "SELECT 1";
                statement = conn.createStatement();
                resultSet = statement.executeQuery(querySql);
                if (resultSet.next() && resultSet.getInt(1) == 1) {
                    statueFlag = "测试数据源成功";
                } else {
                    throw new RuntimeException("测试数据源失败");
                }
            }
            result.put("1", statueFlag);
        } catch (Exception e){
            statueFlag = e.getMessage();
            StackTraceElement ste = e.getStackTrace()[0];
            if ("T4CConnection.java".equals(ste.getFileName())){
                statueFlag = "端口未开放或url配置有误";
            }else if ("T4CTTIoer.java".equals(ste.getFileName())){
                statueFlag = "账号/密码错误";
            }else if (-2==ste.getLineNumber()){
                statueFlag = "测试数据源失败";
            }else if ("T4CTTIoer11.java".equals(ste.getFileName())) {
                statueFlag = "用户名/密码无效；登录被拒绝";
            }
            result.put("0", statueFlag);
        } finally {
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }
}
